package com.ruoyi.common.utils.wxpay.utils;

import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import com.ruoyi.common.utils.Base64;



/**
 *  AES加密解密   记2个很坑的问题
 *  	1、技术出口限制，国内的JDK 默认不支持，报错 Illegal key size；
 *  		解决方法: A、JDK版本低于1.8.171的  需要替换jre里面的local_policy.jar和US_export_policy.jar两个jar包 ，这两个jar去官网下载无限制版本
 *                  B、JDK版本1.8.0_152 或者 1.8.171及以上包含无限制jar，但是默认使用的有限制包，
 *                         所以直接修改jdk8_171\jre\lib\security\java.security  
 *                         #crypto.policy=unlimited  把这个注释打开就好，同时需要注意服务器同步修改
 *  
 *      2、JDK默认不支持PKCS7Padding填充模式，需借助第三方提供者。
 *          <dependency>
 *			    <groupId>org.bouncycastle</groupId>
 *			    <artifactId>bcprov-jdk15</artifactId>
 *			    <version>1.44</version>
 *		    </dependency>
 *         同时在类初始化时，加上如下代码
          static
    {
        if (Security.getProvider("BC") == null) {
            Security
                    .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        } else {
            Security.removeProvider("BC");
            Security
                    .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        }
    }        
 * @author Peter
 */
public class AESUtil {
	 /**
     * 密钥算法
     */
    private static final String ALGORITHM = "AES";
    /**
     * 加解密算法/工作模式/填充方式
     */
    private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding";
 
    /**
     * AES解密
     * @param  
     * @return
     * @throws Exception
     */
    public static String decryptData(String data,String key) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(MD5Util.MD5Encode(key, "UTF-8").toLowerCase().getBytes(), ALGORITHM));
        return new String(cipher.doFinal(Base64.decode(data)));
    }
    
    //解决JDK默认不支持PKCS7Padding填充模式需要  
    static
    {
        if (Security.getProvider("BC") == null) {
            Security
                    .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        } else {
            Security.removeProvider("BC");
            Security
                    .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        }
    }
    	
}
